// Variables globales
var nameApp = "golastica";			// Nombre de la ruta de la aplicación


window.addEvent('domready', function()
{
	// Inicializamos el ShadowBox
	Shadowbox.init();
	
	// Inicializamos el Accordion
	var myAccordion = new Accordion($('accordion'), 'div.accordion_toggler', 'div.accordion_content',
	{
		opacity: false,
		alwaysHide: true,
		display: -1
	});
	
	var avLockCheck = null;
	
	// Inicializamos el FormCheck
	avLockCheck = new FormCheck('form-registro', 
	{
		display : {
			titlesInsteadNames : 1
		}
	});
});


/* 
*  Function defaults by fatbrain
*  http://parentnode.org/javascript/default-arguments-in-javascript-functions/
*/
Function.prototype.defaults = function()
{
	var _f = this;
	var _a = Array(_f.length-arguments.length).concat(Array.prototype.slice.apply(arguments));
	return function()
	{
		return _f.apply(_f, Array.prototype.slice.apply(arguments).concat(_a.slice(arguments.length, _a.length)));
	}
}


/* 
*  Función que permite validar un campo del formulario register. Dependiendo
*  del campo, se llama al respectivo método del controller
*
*/
function verify_field(el)
{
	var url = "/" + nameApp + "/";
	var field = el.getProperty("name");
	var data = el.get("value");
	
	// Nombre del campo de la forma: nameDiv[field]
	if (field.match(/.+\[(.+)\]$/))
		url += "register/verify_field";
	else
		url += "captcha/check";
	
	var answer = sendDataValidate(url, field, data);
	if (!answer[0])
		return true;
	else
	{
		el.errors.push(answer[1]);
		return false;
	}
}


/*
*  Función que crea un objeto link (<a></a>), para cancelar una solicitud ajax
*  	Recibe:
*		- El objeto form o request a cancelar.
*
*	Retorna:
*		- El objeto link creado.
*
*/
function createCancel(myForm)
{
	var objCancel = new Element('a', 
	{
		text: 'Cancelar',
		'class': 'linkdecoration',
		events:
		{
			'click': function(e)
			{
				e.preventDefault();
				cancelForm(myForm.get('id'));
			}
		},
		styles:
		{
			cursor: 'pointer',
			left: '-4px',
			position: 'relative',
			top: '40px'
		}
	});
	
	return objCancel;
}


/* 
*  Función que envía una petición ajax sincronizada de validación de un dato 
*  en método post, y retorna:
*  		
*  		- Un valor booleano (true o false del error)
*  		- Una cadena (mensaje de error)
*/
function sendDataValidate(url, field, data)
{
	var answer = new Array();
	
	// Convertimos una cadena a un objeto JSON, el cual será enviado
	var jsonObjSend = JSON.decode('{"' + field + '":"' + data + '"}');
	
	var request = new Request.JSON(
	{
		url: url,
		async: false,
		onComplete: function(jsonObj)
		{
			answer[0] = jsonObj.error;
			answer[1] = jsonObj.message;
		}
	}).post(jsonObjSend);
	
	return answer;
}


/* 
*  Función que envía una petición ajax de un dato en método post.
*
*	Recibe:
*		- 4 argumentos:
*			->args0: (string|object) Id u objeto formulario
*			->args1: (string) Id del div en donde se actualizará el contenido. Si este no se encuentra establecido (undefined|false), por defecto será el nombre del formulario sin la cadena "form-".
*			->args2: (boolean) True  -> Recarga la página
*				     undefined|False -> Inserta el contenido en el div con nombre enviado a "args1"
*			->args3: (boolean) True  -> Insertar enlace "Cancelar" en el spinner, el cual cancela la solicitud ajax
*				     undefined|False -> No inserta enlace "Cancelar"
*  		
*  		- Un valor booleano (true o false del error)
*  		- Una cadena (mensaje de error)
*		- Nombre de la función para ejecutar el mensaje de error
*
*	Retorna:
*		- false
*
*
*/
function sendData(url, obj)
{	
	var jsonObjSend = JSON.decode('{"' + $(obj).get("name") + '":"' + $(obj).get("value") + '"}');
	
	var myContent = $(!(arguments[2]) ? $(obj).get('id') : arguments[2]);
	var myCancel = (!(arguments[3])) ? false : true;
	
	var objCancel = null;
	
	if (myCancel)
		objCancel = createCancel();
	
	var myRequest = new Request(
	{
		url: url,
		evalScripts: true,
		useSpinner: true,
		spinnerTarget: myContent,
		spinnerOptions: 
		{
			'message' : objCancel
		},
		onRequest: function() {},
		onComplete: function(responseText)
		{
			response = JSON.decode(responseText, true);
			if ((response != null) && response.error)
				window[response.func]('Error', response.message, 'errorMedium.png');
			else
				myContent.set('html', responseText);
		},
		onFailure: function()
		{
			tellSimple('Error', 'Falló al enviar la solicitud', 'errorMedium.png');
		}
	}).post(jsonObjSend);
	
	return false;
}


/* 
*  Función que envía una petición ajax de los datos de un
*  formulario en método post.
*
*	Recibe:
*		- 4 argumentos:
*			->args0: (string|object) Id u objeto formulario
*			->args1: (string) Id del div en donde se actualizará el contenido. Si este no se encuentra establecido (undefined|false), por defecto será el nombre del formulario sin la cadena "form-".
*			->args2: (boolean) True  -> Recarga la página
*				     undefined|False -> Inserta el contenido en el div con nombre enviado a "args1"
*			->args3: (boolean) True  -> Insertar enlace "Cancelar" en el spinner, el cual cancela la solicitud ajax
*				     undefined|False -> No inserta enlace "Cancelar"
*  		
*  		- Un valor booleano (true o false del error)
*  		- Una cadena (mensaje de error)
*		- Nombre de la función para ejecutar el mensaje de error
*
*	Retorna:
*		- false
*
*
*/
function sendForm()
{
	var myForm = $(arguments[0]);
	var myContent = $(!(arguments[1]) ? myForm.get('name').substr(5) : arguments[1]);
	var myUpdate = (!(arguments[2])) ? false : true;
	var myCancel = (!(arguments[3])) ? false : true;
	
	var objCancel = null;
	
	if (myCancel)
		objCancel = createCancel();
	
	myForm.set('send', 
	{
		method: 'post',
		evalScripts: true,
		useSpinner: true,
		spinnerTarget: myContent,
		spinnerOptions: 
		{
			'message' : objCancel
		},
		onRequest: function() {},
		onComplete: function(responseText)
		{
			response = JSON.decode(responseText, true);
			if ((response != null) && response.error)
				window[response.func]('Error', response.message, 'errorMedium.png');
			else
			{
				if (myUpdate)
					window.location = "";
				else
					myContent.set('html', responseText);
			}
		},
		onFailure: function()
		{
			tellSimple('Error', 'Falló al enviar la solicitud', 'errorMedium.png');
		}
	}).send();
	
	return false;
}



function cancelForm(form)
{
	$(form).get('send', {method: 'post'});
	$(form).cancel();
}


/* 
*  Funciones del message
*/
var saySimple = function(titulo, mensaje, icono)
{
	new Message(
	{
		iconPath: "/" + nameApp + "/img/message/", 
		icon: icono, 	
		title: titulo, 		
		message: mensaje,
		waitTime: 4000,
		top: true
	}).say();
}.defaults("", "", "okMedium.png");

var tellSimple = function(titulo, mensaje, icono)
{
	new Message({  
		iconPath: "/" + nameApp + "/img/message/", 
		icon: icono,
		title: titulo,
		message: mensaje
	}).tell();  
}.defaults("", "", "cautionMedium.png");

var askSimple = function(titulo, mensaje, icono)
{
	new Message({     	    
		iconPath: "/" + nameApp + "/img/message/", 
		icon: icono,
		title: titulo,
		message: mensaje,
		callback: "saySimple()"   	
	}).ask();  
}.defaults("", "", "questionMedium.png");

var msg = new Message({ 	
	iconPath: "/" + nameApp + "/img/message/", 
	icon: "blackWaiter.gif",  
	title: "Please wait...",  
	message: "...while I steal your wallet."
});